home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_10_06
/
1006078a
< prev
next >
Wrap
Text File
|
1992-04-22
|
2KB
|
108 lines
#include "makedef.h"
#include <sys\stat.h>
#define FNFERR (-1) /* stat error: file not found */
long process_dependency(TARGET *head, char *build_target)
{
TARGET *p;
time_t dependent_t;
int rebuilt;
if (p = search_target_list(head, build_target))
rebuilt = build_target(head, p, &dependent_t);
else
fatal_error("build target not found");
if (!rebuilt)
printf("\n'%s' is up to date.",build_target);
}
TARGET *search_target_list(TARGET *head, char *target)
{
while (head && strcmp(target, head->target))
head = head->link;
return head;
}
long exec_cmd_list(CMD *p)
{
int status;
while (p) {
printf("\n%s",p->cmdstr);
status = system(p->cmdstr);
if (status)
exit(status);
p = p->link;
}
}
long build_target(TARGET *head, TARGET *p, time_t *parent_t)
{
DEP *q;
TARGET *r;
long status = 0;
time_t dependent_t;
time_t newest_t;
time_t current_vertex_t;
struct stat statbuf;
/*+++++ Initialization +++++*/
p->color = GRAY;
if (FNFERR == stat(p->target, &statbuf))
statbuf.st_mtime = 0;
newest_t = current_vertex_t = statbuf.st_mtime;
/*++++ Check current vertex's dependencies +++++*/
q = p->deplink;
while (q) {
if (NULL == (r = search_target_list(head, q->depstr))) {
if (FNFERR == stat(q->depstr, &statbuf))
fatal_error("dependency not found");
else
dependent_t = statbuf.st_mtime;
} else {
switch (r->color) {
case WHITE:
build_target(head, r, &dependent_t);
break;
case GRAY:
fatal_error("recursive dependency found");
break;
case BLACK:
dependent_t = statbuf.st_mtime;
break;
}
}
if (dependent_t > newest_t)
newest_t = dependent_t;
q = q->link;
}
/*++++ Execute command list ++++*/
if (newest_t > current_vertex_t) {
status++;
exec_cmd_list(p->cmdlink);
if (FNFERR == stat(p->target, &statbuf))
fatal_error("commands did not update target");
newest_t = statbuf.st_mtime;
}else
newest_t = current_vertex_t;
/*++++ Cleanup ++++*/
p->color = BLACK;
*parent_t = newest_t;
return status;
}